package main

import (
	"fmt"
	"log"
	"os"
	"path/filepath"

	"mcp-server/internal/docprocessor"
	"mcp-server/internal/metadata"
)

func main() {
	fmt.Println("=== 文档处理与元数据提取集成演示 ===\n")

	// 创建测试文档
	testContent := `# 国资委监管制度文档

作者：政策研究部

## 第一章 总则

### 第一条 目的和依据
为了加强国有资产监督管理，规范国有企业经营行为，根据《企业国有资产法》等法律法规，制定本办法。

### 第二条 适用范围
本办法适用于国资委监管的各级国有企业及其子企业。

## 第二章 监管职责

### 第三条 监管原则
国资委按照"管资本为主"的要求，重点管好国有资本布局、规范资本运作、提高资本回报、维护资本安全。

### 第四条 监管方式
采用出资人监管、专业监管、综合监管相结合的方式。

## 第三章 企业责任

### 第五条 经营责任
国有企业应当建立健全现代企业制度，完善公司治理结构，提高经营管理水平。

### 第六条 报告义务
企业应当定期向国资委报告经营情况、财务状况和重大事项。

## 第四章 监督检查

### 第七条 检查方式
国资委可以采取定期检查、专项检查、随机抽查等方式进行监督检查。

### 第八条 整改要求
对检查发现的问题，企业应当及时整改并报告整改情况。

## 第五章 附则

### 第九条 解释权
本办法由国资委负责解释。

### 第十条 生效时间
本办法自发布之日起施行。`

	// 创建临时目录
	tmpDir := "temp_integration_test"
	os.MkdirAll(tmpDir, 0755)
	defer os.RemoveAll(tmpDir)

	testFile := filepath.Join(tmpDir, "国资委监管制度.md")
	err := os.WriteFile(testFile, []byte(testContent), 0644)
	if err != nil {
		log.Fatalf("创建测试文件失败: %v", err)
	}

	// 1. 文档分片处理
	fmt.Println("1. 执行文档分片处理...")
	docProcessor := docprocessor.NewDocumentProcessor()
	splitResult, err := docProcessor.ProcessFile(testFile)
	if err != nil {
		log.Fatalf("文档分片失败: %v", err)
	}

	fmt.Printf("   - 文档分片完成，共生成 %d 个分片\n", len(splitResult.Chunks))
	fmt.Printf("   - 处理耗时: %d 毫秒\n", splitResult.Document.ProcessTime)

	// 2. 元数据提取
	fmt.Println("\n2. 执行元数据提取...")
	storageDir := filepath.Join(tmpDir, "metadata_storage")
	metadataManager := metadata.NewDefaultManager(storageDir)

	docMetadata, err := metadataManager.ProcessFile(testFile)
	if err != nil {
		log.Fatalf("元数据提取失败: %v", err)
	}

	fmt.Printf("   - 元数据提取完成\n")
	fmt.Printf("   - 文档标题: %s\n", docMetadata.Title)
	fmt.Printf("   - 作者: %s\n", docMetadata.Author)
	fmt.Printf("   - 文档分类: %s\n", docMetadata.Category)
	fmt.Printf("   - 质量评分: %.2f\n", docMetadata.Quality)

	// 3. 展示分片与元数据的关联
	fmt.Println("\n3. 分片与元数据关联信息:")
	fmt.Printf("   - 文档总字数: %d\n", docMetadata.WordCount)
	fmt.Printf("   - 分片数量: %d\n", len(splitResult.Chunks))
	fmt.Printf("   - 平均每片字数: %.0f\n", float64(docMetadata.WordCount)/float64(len(splitResult.Chunks)))

	// 4. 展示前几个分片的详细信息
	fmt.Println("\n4. 分片详细信息 (前3个):")
	for i, chunk := range splitResult.Chunks {
		if i >= 3 {
			break
		}
		fmt.Printf("   分片 %d:\n", i+1)
		fmt.Printf("     - ID: %s\n", chunk.ID)
		fmt.Printf("     - 行号范围: %d-%d\n", chunk.StartLine, chunk.EndLine)
		fmt.Printf("     - 语义标签: %s\n", chunk.SemanticTag)
		fmt.Printf("     - 内容长度: %d 字符\n", len([]rune(chunk.Content)))
		fmt.Printf("     - 内容预览: %s...\n", truncateString(chunk.Content, 50))
		fmt.Println()
	}

	// 5. 展示提取的关键词和摘要
	fmt.Println("5. 提取的关键信息:")
	fmt.Printf("   关键词: %v\n", docMetadata.Keywords)
	fmt.Printf("   摘要: %s\n", docMetadata.Summary)

	// 6. 模拟向量化关联（这里只是展示概念）
	fmt.Println("\n6. 向量化关联信息:")
	fmt.Printf("   - 每个分片将关联以下元数据:\n")
	fmt.Printf("     * 文档标题: %s\n", docMetadata.Title)
	fmt.Printf("     * 文档作者: %s\n", docMetadata.Author)
	fmt.Printf("     * 文档分类: %s\n", docMetadata.Category)
	fmt.Printf("     * 文档关键词: %v\n", docMetadata.Keywords)
	fmt.Printf("   - 这些元数据将用于增强向量搜索的准确性\n")

	fmt.Println("\n=== 集成演示完成 ===")
	fmt.Println("元数据提取功能已成功集成到文档处理流程中，")
	fmt.Println("可以为向量化和检索提供丰富的元数据支持。")
}

// truncateString 截断字符串
func truncateString(s string, maxLen int) string {
	runes := []rune(s)
	if len(runes) <= maxLen {
		return s
	}
	return string(runes[:maxLen])
}
